home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / ein / wizme / src / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-31  |  27.6 KB  |  1,037 lines

  1. /*<Header>==============================================================
  2. *
  3. *    WIZME / "MAIN.C"    WIZリンクソフト
  4. *
  5. *        [ EIN(tm) project : サンプルプログラム ]
  6. *
  7. *    COPYRIGHT  Nam  1995, All rights reserved.
  8. *
  9. *    配付・組込・改変・商利用すべて自由。ただし無保証っす
  10. *
  11. *-----------------------------------------------------------------------
  12. *    V1.0L01α    95.08.02/Nam    プロトタイプ
  13. *    V1.0L03β    95.08.09/Nam    メタタスク拡張メッセージ対応
  14. *    V1.0L03γ    95.10.31/Nam    存在しないファイル名のチェック/DRAG&DROP対応
  15. *</Header>==============================================================*/
  16. #include    <stdio.h>
  17. #include    <stdlib.h>
  18. #include    <string.h>
  19. #include    <snd.h>
  20. #include    <winb.h>
  21. #include    <te.h>
  22. #include    <fntb.h>
  23. #include    <gui.h>
  24. #include    <egb.h>
  25. #include    <file_dlg.h>
  26. //#include    <tifflib.h>
  27. #include    <msdos.cf>
  28. #include    <loader.h>
  29. #include    <math.h>
  30. #include    <io.h>
  31. #include    <guidbg.h>
  32. #include    <wgb.h>
  33. // ※ ここまでが平均的に使用されるヘッダ
  34.  
  35. #include    <time.h>        // このサンプルでのみ必要
  36. #include    <mos.h>            // このサンプルでのみ必要
  37. #include    <pocket.h>            // このサンプルでのみ必要
  38.  
  39. #include    "..\ein\eintm.h"    // EIN(TM)関連ライブラリのヘッダ
  40. #include    "..\eindd\eindd.h"    // DRAG&DROPライブラリのヘッダ
  41.  
  42.  
  43. #define    ERROR    (-1)
  44. #define    PSET    (0)
  45.  
  46. #define    DISPMODE_ICON    (0)
  47. #define    DISPMODE_PANEL    (1)
  48.  
  49. #define    ID_msg1        (22)
  50. #define    ID_msg2        (23)
  51. #define    ID_fname    (7)
  52.  
  53. int        ID_ICON[4];                    // アイコン部品のID
  54. int        ID_IWIN[24];                    // メモウィンドゥ部品のID
  55. int        ID_T1[2] ;                    // (〃 トグルアイコン部品ID)
  56. int        ID_T2[2] ;
  57. int        ID_T3[2] ;
  58.  
  59. char    fname[128]="";
  60.  
  61. int        dispMode=DISPMODE_PANEL;    // 表示状態(0:アイコン,1:メモウィンドゥ)
  62. int        termMode=0;                    // 通信モード(0:同報,1:同期)
  63. int        convMode=0;                    // 変換モード(0:無変換[CSV],1:変換[メモ])
  64. int        fileMode=0;                    // 入出力先(0:ファイル,1:ポケット)
  65.  
  66. /*= リジューム用設定=================================================*/
  67. FRAME    RSM_ICONFR;
  68. FRAME    RSM_IWINFR;
  69. char    RSMID[]="%%% WizMe %%%";
  70. char    RSMTITLE[]="WizMe  V0.1 L11";
  71. char    RSMFNAME[128];
  72. int        RSMDMODE=DISPMODE_ICON;
  73. int        RSMTMODE=0;
  74. int        RSMCMODE=0;
  75. int        RSMFMODE=0;
  76. /*===================================================================*/
  77.  
  78. void    ( *GV_defIdleTask )();
  79. int        GV_apliLot;
  80.  
  81. MMICTRL    mmic = {
  82.                  SCREEN16 | SCREENIGNORE,        //    resolution
  83.                  SCREENUNUSED,
  84.                  0, SCREENAVAILABLE, 0,    //    write_page,display_page,priority
  85.                  SCREENAVAILABLE,    //    mode
  86.                  SCREENEXPAND,        //    vram_x
  87.                  0,0,0,0,            //    size,*ptr,asize,*atpr
  88.                  0,0,0,0,            //    frame
  89.                  -32767,            //    move
  90.                  -32767,
  91.                   32767,
  92.                   32767,
  93.                  15,8,7,15            //    color
  94.                 } ;
  95.  
  96. /*===================================================================*/
  97. /*  メインループ                                                     */
  98. /*===================================================================*/
  99. void main()
  100. {
  101.     extern int APL_init() ;
  102.     extern int func_HIDE();
  103.  
  104.     int        kobj;
  105.  
  106.     // 初期化処理
  107.     if (MMI_Open( &mmic ) == NOERR){
  108.         // 二重起動のcheck
  109.         if ( (kobj = MMI_CallMessage( MMI_GetApliId(), GM_QUERYID, QM_KIND, 1)) > NOERR ){
  110.             MMI_CallMessage( MMI_GetApliId(), GM_SWITCH, FALSE, kobj );
  111.         } else {
  112.             // アイドルタスクに登録
  113.             setIdleTask();
  114.             // 初期化に成功すればメインループに
  115.             if ( APL_init()==NOERR ){
  116.                 // メインループ
  117.                 MMI_ExecSystem();
  118.             }
  119.             // アイドルの解除
  120.             resetIdleTask();
  121.             // ウィンドゥ消去(※SHELLに消去させると遅いので)
  122.             func_HIDE( ID_ICON[0] );
  123.             func_HIDE( ID_IWIN[0] );
  124.         }
  125.     }
  126.     // 終了処理
  127.     MMI_Close() ;
  128. }
  129.  
  130. /*===================================================================*/
  131. /*  初期化処理                                                       */
  132. /*===================================================================*/
  133. int APL_init()
  134. {
  135.     extern    MMIINIT    initDataRES_ICON ;
  136.     extern    MMIINIT    initDataRES_WIN ;
  137.  
  138.     extern    int ICONmaxId;
  139.     extern    unsigned char *ICONTbl[];
  140.  
  141.     extern int    userFunc();            // イベントループ関数
  142.     extern int    func_TGset();        // トグルボタン設定
  143.     extern int    func_setFname();    // ファイル名設定
  144.  
  145.     HYPER    hyp;
  146.     register int    ret ;
  147.  
  148.     // 
  149.     GV_apliLot = TL_getLot() ;
  150.  
  151.     // GUI部品の初期化
  152.     if ((ret = MMI_initHyper()) < 0)            //    ハイパー型
  153.         return ret;
  154.     if ((ret = MMI_initDialogL40()) < 0)        //    ダイアログ型
  155.         return ret;
  156.     if ((ret = MMI_initAlertL40()) < 0)            //    アラート型
  157.         return ret;
  158.     if ((ret = MMI_initMessageL40()) < 0)        //    メッセージ型
  159.         return ret;
  160.     if ((ret = MMI_initMenuL40()) < 0)            //    メニュー型
  161.         return ret;
  162.     if ((ret = MMI_initButtonL40()) < 0)        //    ボタン型
  163.         return ret;
  164.     if ((ret = MMI_initDrawButtonL40()) < 0)    //    ドロウボタン型
  165.         return ret;
  166.     if ((ret = MMI_initToggleIconL40()) < 0)    //    トグルボタン型
  167.         return ret;
  168.     if ((ret = MMI_initIconL40()) < 0)            //    アイコン型
  169.         return ret;
  170.     if ((ret = MMI_initScrollBarL40()) < 0)        //    スクロールバー型
  171.         return ret;
  172.     if ((ret = MMI_initTextL40()) < 0)            //    テキスト型
  173.         return ret;
  174.     if ((ret = MMI_initMenuItemL40()) < 0)        //    メニューアイテム型
  175.         return ret;
  176.     if ((ret = MMI_initWindowL40()) < 0)        //    ウィンドウ型
  177.         return ret;
  178. //    if ((ret = MMI_initNumBoxL40()) < 0)        //    数値入力パネル型
  179. //        return ret;
  180.     /*    ファイルダイアログを使うときはさらにリストメニューの初期化も必要    */
  181.     /*    リストメニュー型部品の初期化            */
  182.     if ((ret = MMI_initListMenuL40()) < 0)
  183.         return ret ;
  184.  
  185.     // リソースを登録
  186.     if ((ret = MMI_Init(&initDataRES_ICON)) < 0)
  187.         return ret ;
  188.     if ((ret = MMI_Init(&initDataRES_WIN)) < 0)
  189.         return ret ;
  190.  
  191.     // ユーザアイコンを登録
  192.     MMI_SetIconTable( ICONTbl, ICONmaxId ) ;
  193.  
  194.     // GUI色をメニュー色に設定
  195.     EIN_initGuiColor();
  196.  
  197.     /*----------------------------------------------------------------*/
  198.     /*  リジューム読み込み (※のついた処理は必ず行ってください)       */
  199.     /*----------------------------------------------------------------*/
  200.     char    work[RSMWORKSIZE];    // リジュームマネージャのワークエリア
  201.     char    buf[1024];
  202.     char    *ptr;
  203.     int        size, x, y, i, j;
  204.     char    s[128];
  205.  
  206.     // ※リジュームマネージャの初期化(アプリのIDタグ登録)
  207.     EIN_rsmInit( work, RSMID );
  208.     // ※読み込みバッファ設定
  209.     EIN_rsmBufSet( work, buf, 1023 );
  210.     // ※リジューム情報読み込み
  211.     size = EIN_rsmLoad( work );
  212.     #ifdef DEBUG
  213.     printf(" resume size(%d)\n",size);
  214.     #endif
  215.     if ( size > 0 ){
  216.         // ICON表示位置
  217.         if ( ((ptr = strstr(buf,"\nICON: ")) != NULL ) &&
  218.              (sscanf(ptr,"\nICON: %d %d\n", &x, &y) > 1 ) ){
  219.             // 枠座標を得る
  220.             MMI_SendMessage( ID_ICON[0], MM_GETHYPER, 1, &hyp );
  221.             RSM_ICONFR.lupx = x;
  222.             RSM_ICONFR.lupy = y;
  223.             RSM_ICONFR.rdwx = x+(hyp.fr.rdwx-hyp.fr.lupx);
  224.             RSM_ICONFR.rdwy = y+(hyp.fr.rdwy-hyp.fr.lupy);
  225.             #ifdef DEBUG
  226.             printf("ICON: move to (%d,%d)\n", x, y);
  227.             #endif
  228.             if ( x<-31 ){    x=0;    }
  229.             if ( y<-31 ){    y=0;    }
  230.             MMI_SendMessage( ID_ICON[0], MM_MOVE, 1, &RSM_ICONFR ) ;
  231.         }
  232.         // メモウィンドゥ表示位置
  233.         if ( ((ptr = strstr(buf,"\nIWIN: ")) != NULL ) &&
  234.              (sscanf(ptr,"\nIWIN: %d %d\n", &x, &y) > 1 ) ){
  235.             // 枠座標を得る
  236.             MMI_SendMessage( ID_IWIN[0], MM_GETHYPER, 1, &hyp );
  237.             RSM_IWINFR.lupx = x;
  238.             RSM_IWINFR.lupy = y;
  239.             RSM_IWINFR.rdwx = x+(hyp.fr.rdwx-hyp.fr.lupx);
  240.             RSM_IWINFR.rdwy = y+(hyp.fr.rdwy-hyp.fr.lupy);
  241.             #ifdef DEBUG
  242.             printf("IWIN: move to (%d,%d)\n", x, y);
  243.             #endif
  244.             if ( x<-31 ){    x=0;    }
  245.             if ( y<-31 ){    y=0;    }
  246.             MMI_SendMessage( ID_IWIN[0], MM_MOVE, 1, &RSM_IWINFR ) ;
  247.         }
  248.         // 各種状態
  249.         if ( ((ptr = strstr(buf,"\nMODE: ")) != NULL ) &&
  250.              (sscanf(ptr,"\nMODE: %d %d %d %d\n", &x, &y, &i, &j) > 3 ) ){
  251.             dispMode = (x==0) ?DISPMODE_ICON :DISPMODE_PANEL;
  252.             RSMDMODE = dispMode;
  253.             termMode = (y==0) ?0 :1;
  254.             RSMTMODE = termMode;
  255.             convMode = (i==0) ?0 :1;
  256.             RSMCMODE = convMode;
  257.             fileMode = (j==0) ?0 :1;
  258.             RSMFMODE = fileMode;
  259.             #ifdef DEBUG
  260.             printf("MODE: %d %d %d %d\n", x, y, i, j);
  261.             #endif
  262.         }
  263.         // ファイル名を得る
  264.         if ( ((ptr = strstr(buf,"\nFNAME: ")) != NULL ) &&
  265.              (sscanf(ptr,"\nFNAME: %s\n", &s) > 0 ) ){
  266.             #ifdef DEBUG
  267.             printf("FNAME: %s\n", s);
  268.             #endif
  269.             strcpy( RSMFNAME, s );
  270.             strcpy( fname, s );
  271.             MMI_SendMessage( ID_IWIN[ID_fname], MM_SETMSG, 1, fname );
  272.         }
  273.     }
  274.     if ( strlen(fname) < 1 ){
  275.         // ファイル名が存在しないのでポケットで入出力
  276.         fileMode = 1;
  277.         RSMFMODE = fileMode;
  278.     }
  279.     func_setFname();    // ファイル名をMSG部品に設定
  280.  
  281.     // ウィンドウ類をベース部品にATTACH
  282.     if ( dispMode == DISPMODE_ICON ){
  283.         MMI_SendMessage( ID_ICON[0], MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  284.     } else {
  285.         MMI_SendMessage( ID_IWIN[0], MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  286.     }
  287.  
  288.     // トグルボタンの値を設定
  289.     func_TGset( 0 );
  290.  
  291.     // スイッチャー対応関数の登録
  292.     MMI_SendMessage( MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc ) ;
  293.  
  294.     // タスクリストにタイトルを登録
  295.     MMI_CallMessage( MMI_GetApliId(), GM_TITLE, (int)RSMTITLE, 0 ) ;
  296.  
  297.     //    背景を表示
  298.     MMI_SendMessage( MMI_GetBaseObj(), MM_SHOW, 0 ) ;
  299.  
  300.     return NOERR ;
  301. }
  302.  
  303. /*===================================================================*/
  304. /* リジューム情報更新 (※がついた処理は必ず行って下さい)             */
  305. /*===================================================================*/
  306. void    SaveResumeFile()
  307. {
  308.     char    work[RSMWORKSIZE];
  309.     char    buf[1024];
  310.     char    aplpath[128];
  311.     HYPER    hyp1, hyp2;
  312.     register int ret;
  313.     
  314.     // 枠座標を得る
  315.     MMI_SendMessage( ID_ICON[0], MM_GETHYPER, 1, &hyp1 );
  316.     MMI_SendMessage( ID_IWIN[0],  MM_GETHYPER, 1, &hyp2 );
  317.     
  318.     // 移動していたらセーブ
  319.     if ( (RSM_ICONFR.lupx  != hyp1.fr.lupx) ||
  320.          (RSM_ICONFR.lupy  != hyp1.fr.lupy) ||
  321.          (RSM_IWINFR.lupx  != hyp2.fr.lupx) ||
  322.          (RSM_IWINFR.lupy  != hyp2.fr.lupy) ||
  323.          (RSMDMODE         != dispMode)||        // 表示状態が違う
  324.          (RSMTMODE         != termMode)||        // 通信状態が違う
  325.          (RSMCMODE         != convMode)||        // 変換形式が違う
  326.          (RSMFMODE         != fileMode)||        // 入出力先が違う
  327.          (strcmp(RSMFNAME,fname)!=0) ){            // ファイル名が違う
  328.         // ※マネージャ初期化
  329.         EIN_rsmInit( work, RSMID );
  330.         // ※バッファ設定(アプリ識別ID,更新時刻は自動設定されます)
  331.         EIN_rsmBufSet( work, buf, 1023 );
  332.         // ※アプリディレクトリ保存
  333.         MMI_CallMessage( MMI_GetApliId(), GM_QUERYID, QM_PATH, (int)aplpath );
  334.         EIN_rsmBufPrintf( work, "APLPATH: %s", aplpath );
  335.         // ※アプリ名保存
  336.         EIN_rsmBufPrintf( work, "TITLE:   %s", RSMTITLE );
  337.         // ※コメント保存
  338.         EIN_rsmBufCat( work, "COMMENT: #のWizと連携するっす。");
  339.         // アイコン位置保存
  340.         EIN_rsmBufPrintf( work, "ICON: %d %d", hyp1.fr.lupx, hyp1.fr.lupy );
  341.         // メモウィンドゥ位置保存
  342.         EIN_rsmBufPrintf( work, "IWIN: %d %d", hyp2.fr.lupx, hyp2.fr.lupy );
  343.         // 各種モード保存
  344.         EIN_rsmBufPrintf( work, "MODE: %d %d %d %d", dispMode, termMode, convMode, fileMode );
  345.         // メモファイル名保存
  346.         EIN_rsmBufPrintf( work, "FNAME: %s", fname );
  347.         // ※バッファ終端(^A)設定
  348.         EIN_rsmBufTail( work );
  349.         // ※バッファをセーブ
  350.         ret = EIN_rsmSave( work );
  351.         #ifdef DEBUG
  352.         printf(" resume save size(%d)   ptr:(%d,%d)\n",ret, hyp1.fr.lupx, hyp1.fr.lupy);
  353.         #endif
  354.     }
  355. }
  356.  
  357. /*===================================================================*/
  358. /*  イベントループ関数                                               */
  359. /*===================================================================*/
  360. int        userFunc( int apliId, int messId, int info, int data )
  361. {
  362.     // メタタスク拡張メッセージ ( GM_EXECUSER で、info で渡す )
  363.     #define MTL_ICONIZE     0x8000      // アイコン化
  364.     #define MTL_RESTORE     0x8001      // 復元
  365.     #define MTL_MAXIMIZE    0x8002      // 最大化
  366.  
  367.     // 入力ウィンドゥ表示 & アイコン消去
  368.     extern int    func_show();
  369.     // 入力ウィンドゥ一時消去
  370.     extern int    func_hide();
  371.  
  372.     register    int        ret ;
  373.  
  374.     ret = ILLEGAL_FUNCTION ;
  375.     switch( messId ){
  376.         //    他タスクからスイッチしてきた
  377.         case GM_WAKE :
  378.             break ;
  379.  
  380.         //    他タスクにスイッチする
  381.         case GM_SLEEP :
  382.             break ;
  383.  
  384.         //    画面変更前処理
  385.         case GM_PRESCRCHG :
  386.             break ;
  387.  
  388.         //    画面変更後処理
  389.         case GM_POSTSCRCHG :
  390.             break ;
  391.  
  392.         //    一時停止要求が出た
  393.         case GM_PAUSE :
  394.             break ;
  395.  
  396.         //    一時停止解除要求が出た
  397.         case GM_CONTINUE :
  398.             break ;
  399.  
  400.         //    終了要求が出た
  401.         case GM_QUIT :
  402.             // リジューム
  403.             SaveResumeFile();
  404.             //    正常終了
  405.             MMI_SetHaltFlag( TRUE ) ;    //    イベントループを終了させるフラグ
  406.             ret = NOERR ;
  407.             break ;
  408.  
  409.         // メタタスク拡張メッセージ対応
  410.         case GM_EXECUSER :                // メタタスクが送信する
  411.             if ( info == MTL_ICONIZE ){
  412.                 // アイコン化メッセージだったら
  413.                 func_hide();
  414.             } else if ( info == MTL_RESTORE ){
  415.                 // サイズ復元メッセージだったら
  416.                 func_show();
  417.             } else if ( info == MTL_MAXIMIZE ){
  418.                 // 最大化メッセージだったら
  419.                 func_show();
  420.             }
  421.             ret = NOERR ;
  422.             break;
  423.         // DRAG&DROPメッセージ対応 '95.10.31
  424.         case GM_SENDDATA :
  425.             // プールからファイル名を受け取る
  426.             if ( EINDD_receivePool( info, data, fname, NULL )== NOERR ){
  427.                 // ファイル名を設定して再表示
  428.                 func_showFname();
  429.             }
  430.             ret = NOERR ;
  431.             break ;
  432.  
  433.     }
  434.  
  435.     return ret ;
  436. }
  437.  
  438. /*===================================================================*/
  439. /*  アイドルタスク関数(アイコン上に時計表示)                         */
  440. /*===================================================================*/
  441. void    userIdleTask()
  442. {
  443.     static int        btime = 0;
  444.     register int    ntime;
  445.  
  446.     static int        optn = 0;
  447.     register int    ptn;
  448.  
  449.     // アイコンモードで無いならなら何もしない
  450.     if ( dispMode!=DISPMODE_ICON){
  451.         return;
  452.     }
  453.     ntime = MOS_getTime();
  454.     /* 前回から1800ms未満なら終了 */
  455.     if ( abs(ntime - btime) < 120 ){
  456.         return;
  457.     }
  458.     btime = ntime;
  459.     
  460.     ptn = 512 + 4 + rand()%10;
  461.     // パターンが前と同じなら更新しない
  462.     if ( ptn != optn ){
  463.         MMI_SendMessage( ID_ICON[3], MM_SETSHAPE, 1, ptn);
  464.         MMI_SendMessage( ID_ICON[3], MM_SHOW, 0 );
  465.     }
  466.     optn = ptn;
  467. }
  468.  
  469. /*===================================================================*/
  470. /*  アイドルタスクに登録                                             */
  471. /*===================================================================*/
  472. int        setIdleTask()
  473. {
  474.     void    ( *idleTask )() ;
  475.  
  476.     /*    アイドル処理関数の取得    */
  477.     idleTask = MMI_GetIdleTaskFunc() ;
  478.  
  479.     /*    二重登録禁止チェック    */
  480.     if( idleTask != userIdleTask ){
  481.         GV_defIdleTask = idleTask ;
  482.         MMI_SetIdleTaskFunc( (void ((*)(void)))userIdleTask );
  483.     }
  484.     return NOERR;
  485. }
  486.  
  487. /*===================================================================*/
  488. /*  アイドルタスクから削除                                           */
  489. /*===================================================================*/
  490. int        resetIdleTask()
  491. {
  492.     void    ( *IdleTask )() ;
  493.  
  494.     /*    アイドル処理関数の取得    */
  495.     IdleTask = MMI_GetIdleTaskFunc() ;
  496.  
  497.     /*    USER関数登録のチェック    */
  498.     if( IdleTask == userIdleTask ){
  499.         MMI_SetIdleTaskFunc( GV_defIdleTask ) ;
  500.         GV_defIdleTask = 0 ;
  501.     }
  502.     return NOERR;
  503. }
  504.  
  505.  
  506. /*===================================================================*/
  507. /*  アイコン化されたウィンドゥの関数                                 */
  508. /*===================================================================*/
  509. int        func_ICON( int kobj, int messId, int ac, EVENT *pev, int trigger )
  510. {
  511.     HYPER    hyp;
  512.     FRAME    fr;
  513.  
  514.     if( messId == MM_SHOW ){
  515.         return ERROR;
  516.     }
  517.     // ※ ここでダブルクリックなら関数起動 / それ以外ならMOVE
  518.     if( messId == MM_MOUSEON ){
  519.         // 枠座標を得る
  520.         MMI_SendMessage( kobj, MM_GETHYPER, 1, &hyp );
  521.         fr = hyp.fr;
  522.         do {
  523.             MMI_iosense();
  524.         } while( (MMI_GetEvnt((EVMOSUP|EVMOSDRAG), &pev)) < NOERR);
  525.         if ( pev->what == EVMOSUP ){
  526.             // ダブルクリックチェック
  527.             if ( MMI_DoubleClickCheck(&fr, pev) != FALSE ){
  528.                 // 「アイコン→ウィンドゥ表示」
  529.                 func_show();
  530.             }
  531.             return NOERR;
  532.         }
  533.         // ダブルクリックでは無いのでMOVE処理へ
  534.     }
  535.     // エラーで抜けるとWINDOW部品本来の動作をしまっする♪
  536.     return ERROR;
  537. }
  538.  
  539. /*===================================================================*/
  540. /*  部品表示(汎用)                                                   */
  541. /*===================================================================*/
  542. int    func_SHOW( int id )
  543. {
  544.     char        clp[EINCLIPSIZE];
  545.     register int    ret;
  546.  
  547.     // アイコンをATTACHする
  548.     ret = MMI_SendMessage( id, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  549.     // アイコンを表示する
  550.     EIN_clipOpen( clp );
  551.     MMI_SendMessage( id, MM_SHOW, 0 ) ;
  552.     MMI_SendMessage( id, MM_WAKE, 0 ) ;
  553.     EIN_clipClose( clp );
  554.  
  555.     return ret;
  556. }
  557.  
  558. /*===================================================================*/
  559. /*  部品消去(汎用)                                                   */
  560. /*===================================================================*/
  561. int    func_HIDE( int id )
  562. {
  563.     MMI_SendMessage( id, MM_SLEEP, 0 );
  564.     MMI_SendMessage( id, MM_ERASE, 0 );
  565.     MMI_SendMessage( id, MM_DETACH, 0 );
  566.     return NOERR;
  567. }
  568.  
  569. /*===================================================================*/
  570. /*  入力ウィンドゥ表示 & アイコン消去                                */
  571. /*===================================================================*/
  572. int    func_show()
  573. {
  574.     // 既にウィンドゥが表示されているなら何もしない
  575.     if ( dispMode==DISPMODE_PANEL){
  576.         return NOERR;
  577.     }
  578.     dispMode=DISPMODE_PANEL;
  579.  
  580.     // アイコンを消去する
  581.     func_HIDE( ID_ICON[0] );
  582.     // 入力ウィンドゥを表示する
  583.     func_SHOW( ID_IWIN[0] );
  584.  
  585.     return NOERR;
  586. }
  587.  
  588. /*===================================================================*/
  589. /*  入力ウィンドゥ一時消去                                           */
  590. /*===================================================================*/
  591. int    func_hide()
  592. {
  593.     // パネルが表示されていないなら何もしない
  594.     if ( dispMode!=DISPMODE_PANEL){
  595.         return ERROR;
  596.     }
  597.     dispMode=DISPMODE_ICON;
  598.  
  599.     // 入力ウィンドゥを消去する
  600.     func_HIDE( ID_IWIN[0] );
  601.     // アイコンを表示
  602.     func_SHOW( ID_ICON[0] );
  603.  
  604.     return NOERR;
  605. }
  606.  
  607. int    func_close()
  608. {
  609.     // リジューム
  610.     SaveResumeFile();
  611.     //    正常終了
  612.     MMI_SetHaltFlag( TRUE ) ;    //    イベントループを終了させるフラグ
  613.     return NOERR;
  614. }
  615.  
  616. // ファイル名/ポケット をMSG部品に設定
  617. int        func_setFname()
  618. {
  619.     static char    str_pocket[]="(ポケット入出力モード)";
  620.  
  621.     // 入出力先(0:ファイル,1:ポケット)
  622.     if ( fileMode == 0 ){
  623.         MMI_SendMessage( ID_IWIN[ID_fname], MM_SETMSG, 1, fname );
  624.     } else {
  625.         MMI_SendMessage( ID_IWIN[ID_fname], MM_SETMSG, 1, str_pocket );
  626.     }
  627.     return NOERR;
  628. }
  629.  
  630. // ファイル名部品を設定して再表示
  631. int        func_showFname()
  632. {
  633.     char    str_erase[] ="                              ";
  634.     MMI_SendMessage( ID_IWIN[ID_fname], MM_SETMSG, 1, str_erase );
  635.     MMI_SendMessage( ID_IWIN[ID_fname], MM_SHOW, 0 );
  636.     func_setFname();
  637.     MMI_SendMessage( ID_IWIN[ID_fname], MM_SHOW, 0 );
  638.     return NOERR;
  639. }
  640.  
  641. // ファイルダイアログを表示してファイル名を取得
  642. int    func_fname()
  643. {
  644.     unsigned int    InfSw;
  645.     char            *ExtStr[]={"*.*", NULL};
  646.     unsigned int    MSlctCnt;
  647.     int                Atr, i, ret;
  648.     char            path[128], filename[12];
  649.     FILE    *fp;
  650.  
  651. retry:
  652.     ret = FDG_InitFileDlg();
  653.     if ( ret < 0 ){
  654.         return ERROR;
  655.     }
  656.     FDG_SaveCurDir();
  657. //    // Qドライブはパスする
  658. //    FDG_SetPassDrv("Q");
  659.     FDG_SetTitle( "ファイル名指定", "実行", "取消" );
  660.     InfSw=(FDG_TEXT|FDG_FILEONLY|FDG_REDRAW|FDG_ALERT);
  661.     // 初期パスを設定
  662.     // (指定ファイルの存在をチェック  '95.10.31)
  663.     if ( (strlen(fname)>0) &&
  664.          (fp = EIN_fopen( fname, "r" )) != (FILE *)NULL ){
  665.         fclose(fp);
  666.         EIN_fnameNonDirectory( fname, filename );
  667.         EIN_fnameDirectory( fname, path );
  668.         // パス名末尾の"¥"を削除する(FDGの仕様)
  669.         i=strlen(path)-1;
  670.         if (i>0){
  671.             path[i] = 0;
  672.         }
  673.         #ifdef DEBUG
  674.         printf("%s\n%s\n", filename, path);
  675.         #endif
  676.         FDG_SetFileText( filename );
  677.         ret=FDG_DspFileDlg( MMI_GetBaseObj(), InfSw, path, ExtStr, &MSlctCnt );
  678.     } else {
  679.         // ファイルが無い場合
  680.         ret=FDG_DspFileDlg( MMI_GetBaseObj(), InfSw, NULL, ExtStr, &MSlctCnt );
  681.     }
  682.     FDG_RecovCurDir();
  683.     // 取り消されたら終了
  684.     if ( ret != 1 ){
  685.         FDG_FreeFileDlg();
  686.         return ERROR;
  687.     }
  688.     FDG_GetPathName( fname, &Atr, 0 );
  689.     FDG_FreeFileDlg();
  690.     // 小文字は大文字に
  691.     for ( i=0; i<strlen(fname); i++ ){
  692.         fname[i] = toupper( (int)fname[i] );
  693.     }
  694.     // ファイル名を表示
  695.     func_showFname();
  696.  
  697.     return NOERR;
  698. }
  699.  
  700. // トグルアイコンの値を設定 (flag!=0 なら再描画)
  701. int    func_TGset( int flag )
  702. {
  703.     register int    i;
  704.  
  705.     // 通信モード(0:同報,1:同期)
  706.     if ( termMode == 0 ){
  707.         MTL_setFlagObj(   ID_T1[0], MS_TOGGLE );
  708.         MTL_resetFlagObj( ID_T1[1], ~MS_TOGGLE );
  709.     } else {
  710.         MTL_resetFlagObj( ID_T1[0], ~MS_TOGGLE );
  711.         MTL_setFlagObj(   ID_T1[1], MS_TOGGLE );
  712.     }
  713.     // 変換モード(0:無変換[CSV],1:変換[メモ])
  714.     if ( convMode == 0 ){
  715.         MTL_setFlagObj(   ID_T2[0], MS_TOGGLE );
  716.         MTL_resetFlagObj( ID_T2[1], ~MS_TOGGLE );
  717.     } else {
  718.         MTL_resetFlagObj( ID_T2[0], ~MS_TOGGLE );
  719.         MTL_setFlagObj(   ID_T2[1], MS_TOGGLE );
  720.     }
  721.     // 入出力先(0:ファイル,1:ポケット)
  722.     if ( fileMode == 0 ){
  723.         MTL_setFlagObj(   ID_T3[0], MS_TOGGLE );
  724.         MTL_resetFlagObj( ID_T3[1], ~MS_TOGGLE );
  725.     } else {
  726.         MTL_resetFlagObj( ID_T3[0], ~MS_TOGGLE );
  727.         MTL_setFlagObj(   ID_T3[1], MS_TOGGLE );
  728.     }
  729.     if ( flag != 0 ){
  730.         for ( i=0; i<2; i++ ){
  731.             MMI_SendMessage( ID_T1[i], MM_SHOW, 0 );
  732.             MMI_SendMessage( ID_T2[i], MM_SHOW, 0 );
  733.             MMI_SendMessage( ID_T3[i], MM_SHOW, 0 );
  734.         }
  735.     }
  736.  
  737.     return NOERR;
  738. }
  739.  
  740. int    func_TGicon( int kobj, int messId, int ac, EVENT *pev, int trigger )
  741. {
  742.     // 通信モード(0:同報)
  743.     if ( kobj == ID_T1[0] ){
  744.         termMode = 0;
  745.         func_TGset( 1 );
  746.         DM_showMsg( "光通信モードに設定しました", "(『光通信』キーで実行される非同期通信モード)" );
  747.         return NOERR;
  748.     }
  749.     // 通信モード(1:同期)
  750.     if ( kobj == ID_T1[1] ){
  751.         termMode = 1;
  752.         func_TGset( 1 );
  753.         DM_showMsg( "オプション通信モードに設定しました", "(『メニュー』から実行する同期通信モード)" );
  754.         return NOERR;
  755.     }
  756.     // 変換モード(0:無変換[CSV])
  757.     if ( kobj == ID_T2[0] ){
  758.         convMode = 0;
  759.         func_TGset( 1 );
  760.         DM_showMsg( "CSVモードに設定しました", "(通信するデータに手を加えません)" );
  761.         return NOERR;
  762.     }
  763.     // 変換モード(1:変換[メモ])
  764.     if ( kobj == ID_T2[1] ){
  765.         convMode = 1;
  766.         func_TGset( 1 );
  767.         DM_showMsg( "テキスト変換モードに設定しました", "(テキスト<->CSV形式に相互変換します)" );
  768.         return NOERR;
  769.     }
  770.     // 入出力先(0:ファイル)
  771.     if ( kobj == ID_T3[0] ){
  772.         fileMode = 0;
  773.         func_TGset( 1 );
  774.         func_showFname();    // ファイル名を表示
  775.         DM_showMsg( "ファイルモードに設定しました", "(指定ファイル名にセーブ/ロードします)" );
  776.         return NOERR;
  777.     }
  778.     // 入出力先(1:ポケット)
  779.     if ( kobj == ID_T3[1] ){
  780.         fileMode = 1;
  781.         func_TGset( 1 );
  782.         func_showFname();    // ファイル名を表示(ポケットモード)
  783.         DM_showMsg( "ポケットモードに設定しました", "(ポケットにセーブ/ロードします)" );
  784.         return NOERR;
  785.     }
  786.  
  787.     return NOERR;
  788. }
  789.  
  790. static char    str_erase[48]= "                                              ";
  791.  
  792. int    DM_setMsg( char *str1, char *str2 )
  793. {
  794.     if ( str1!=NULL){
  795.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SETMSG, 1, str1 );
  796.     } else {
  797.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SETMSG, 1, str_erase );
  798.     }
  799.     if ( str2!=NULL){
  800.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str2 );
  801.     } else {
  802.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str_erase );
  803.     }
  804.     return NOERR;
  805. }
  806.  
  807. int    DM_showMsg( char *str1, char *str2 )
  808. {
  809.     if ( str1!=NULL){
  810.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SETMSG, 1, str_erase );
  811.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SHOW, 0 );
  812.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SETMSG, 1, str1 );
  813.     } else {
  814.         MMI_SendMessage( ID_IWIN[ID_msg1], MM_SETMSG, 1, str_erase );
  815.     }
  816.     MMI_SendMessage( ID_IWIN[ID_msg1], MM_SHOW, 0 );
  817.  
  818.     if ( str2!=NULL){
  819.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str_erase );
  820.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SHOW, 0 );
  821.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str2 );
  822.     } else {
  823.         MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str_erase );
  824.     }
  825.     MMI_SendMessage( ID_IWIN[ID_msg2], MM_SHOW, 0 );
  826.  
  827.     return NOERR;
  828. }
  829.  
  830. int    DM_dispCount( int flag )
  831. {
  832.     static char    str_msg[31];
  833.     static int    cnt = 1;
  834.  
  835.     // 
  836.     if ( flag < 0 ){
  837.         cnt = 1;
  838.         return NOERR;
  839.     }
  840.     if ( flag == 0 ){
  841.         sprintf( str_msg, "[ %d block. ]", cnt );
  842.     } else {
  843.         sprintf( str_msg, "[ %d/%d block. ]", cnt, flag );
  844.     }
  845.     cnt++;
  846.     // まず古い文字列を消去
  847.     MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str_erase );
  848.     MMI_SendMessage( ID_IWIN[ID_msg2], MM_SHOW, 0 );
  849.     MMI_SendMessage( ID_IWIN[ID_msg2], MM_SETMSG, 1, str_msg );
  850.     MMI_SendMessage( ID_IWIN[ID_msg2], MM_SHOW, 0 );
  851.     return NOERR;
  852. }
  853.  
  854. extern int    IR_checkWC();
  855. extern int    IR_syncRead();
  856. extern int    IR_onsideRead();
  857. extern int    IR_syncSend();
  858. extern int    IR_onsideSend();
  859. extern int    WL_purgeBuf();
  860. extern int    WL_mallocBuf();
  861. extern int    WL_shrinkBuf();
  862. extern int    WL_putEOF();
  863. extern int    WL_saveFile();
  864. extern int    WL_savePocket();
  865. extern int    WL_getFileSize();
  866. extern int    WL_getPocketSize();
  867. extern int    WL_loadFile();
  868. extern int    WL_loadPocket();
  869. extern int    WL_convText2Csv();
  870. extern int    WL_convCsv2Text();
  871. extern int    IR_waitBreak();
  872.  
  873. extern char    *termBuf;            // 送受信元データバッファ
  874. extern int    termSize;            // 元データバッファ内データサイズ(bytes)
  875.  
  876. // 送信
  877. int    func_send()
  878. {
  879.     int        ret, size;
  880.  
  881.     // ワイヤレスコマンダー接続チェック
  882.     if ( IR_checkWC()!=NOERR ){
  883.         return ERROR;
  884.     }
  885.     // 入出力先(0:ファイル,1:ポケット)
  886.     if ( fileMode == 0 ){
  887.         if ( strlen(fname)< 1 ){
  888.             DM_showMsg( "※送信ファイル名を指定してね", NULL );
  889.             return ERROR;
  890.         }
  891.         if ( (size = WL_getFileSize()) < 1 ){
  892.             DM_showMsg( "※ファイルが見当たらないっす (T-T)", NULL );
  893.             return ERROR;
  894.         }
  895.     } else {
  896.         if ( (size = WL_getPocketSize()) < 1 ){
  897.             DM_showMsg( "※ポケットのデータが読めんす (T-T)", NULL );
  898.             return ERROR;
  899.         }
  900.     }
  901.     // 読み込みバッファ取得 ( size+1 にするのは、後で0x1aを付加する時の為)
  902.     if ( WL_mallocBuf( size + 1 ) != NOERR ){
  903.         DM_showMsg( "メモリ不足っす (T-T)", NULL );
  904.         return ERROR;
  905.     }
  906.     // 読み込みサイズ設定
  907.     termSize = size;
  908.     #ifdef DEBUG
  909.     printf(" size = %d\n", size);
  910.     #endif
  911.  
  912.     // 入出力先(0:ファイル,1:ポケット)
  913.     if ( fileMode == 0 ){
  914.         ret = WL_loadFile( termBuf, termSize );
  915.     } else {
  916.         ret = WL_loadPocket( termBuf, termSize );
  917.     }
  918.     if ( (ret != NOERR) || (termSize == 0) ){
  919.         DM_showMsg( "送信データ読み込みに失敗したっす (T-T)", NULL );
  920.         return ERROR;
  921.     }
  922.  
  923.     // 変換モード(0:無変換[CSV],1:変換[メモ])
  924.     if ( convMode != 0 ){
  925.         // 本文から無地メモ形式に変換
  926.         WL_convText2Csv( 1024 );
  927.     }
  928.  
  929.     // マウス消去
  930.     MG_mosDisp( 2 );
  931.     // バッファ末尾に0x1aが無ければ追加する
  932.     WL_putEOF();
  933.     // 通信モード(0:光通信[同報],1:オプション[同期])
  934.     if ( termMode == 0 ){
  935.         ret = IR_onsideSend();
  936.     } else {
  937.         ret = IR_syncSend();
  938.     }
  939.     // マウス復帰
  940.     MG_mosDisp( 3 );
  941.     if ( ret != NOERR ){
  942.         WL_purgeBuf();
  943.         // この場合は各関数内でエラー表示しているので何も表示せず終了
  944.         return ERROR;
  945.     }
  946.     DM_showMsg( "送信完了", NULL );
  947.     // バッファを開放
  948.     WL_purgeBuf();
  949.  
  950.     return NOERR;
  951. }
  952.  
  953. // 受信
  954. int    func_receive()
  955. {
  956.     int        ret;
  957.  
  958.     // ワイヤレスコマンダー接続チェック
  959.     if ( IR_checkWC()!=NOERR ){
  960.         return ERROR;
  961.     }
  962.     // 入出力先(0:ファイル,1:ポケット)
  963.     if ( fileMode == 0 ){
  964.         if ( strlen(fname)< 1 ){
  965.             DM_showMsg( "※受信ファイル名を指定してね", NULL );
  966.             return ERROR;
  967.         }
  968.     }
  969.     // ファイルの上書きチェック
  970.     if ( fileMode == 0 ){
  971.         if ( WL_getFileSize() > 0 ){
  972.             DM_showMsg( "※ファイルに上書きしてい~のかなぁ?", "(右クリックで中止)" );
  973.             if ( IR_waitBreak(3) != NOERR ){
  974.                 DM_showMsg( "中断したっす", NULL );
  975.                 return ERROR;
  976.             }
  977.         }
  978.     }
  979.     // 通信モード(0:光通信[同報],1:オプション[同期])
  980.     if ( termMode == 0 ){
  981.         ret = WL_mallocBuf( 1024*64 );
  982.     } else {
  983.         ret = WL_mallocBuf( 1024*256 );
  984.     }
  985.     if ( ret != NOERR ){
  986.         DM_showMsg( "メモリ不足っす (T-T)", NULL );
  987.         return ERROR;
  988.     }
  989.     // マウス消去
  990.     MG_mosDisp( 2 );
  991.     // 通信モード(0:光通信[同報],1:オプション[同期])
  992.     if ( termMode == 0 ){
  993.         ret = IR_onsideRead();
  994.     } else {
  995.         ret = IR_syncRead();
  996.     }
  997.     // マウス復帰
  998.     MG_mosDisp( 3 );
  999.     if ( (ret != NOERR) || (termSize == 0)  ){
  1000.         // この場合は各関数内でエラー表示しているので何もせず終了
  1001.         WL_purgeBuf();
  1002.         return ERROR;
  1003.     }
  1004.     DM_showMsg( "受信完了", NULL );
  1005.  
  1006.     #ifdef DEBUG
  1007.     printf("get %x, %d bytes\n", termBuf,termSize);
  1008.     #endif
  1009.  
  1010.     // バッファ末尾に0x1aが無ければ追加する
  1011.     WL_putEOF();
  1012.     // 元バッファをshrink
  1013.     WL_shrinkBuf();
  1014.     // 変換モード(0:無変換[CSV],1:変換[メモ])
  1015.     if ( convMode != 0 ){
  1016.         // 本文のみを摘出
  1017.         WL_convCsv2Text();
  1018.  
  1019.         // 元バッファをshrink
  1020.         WL_shrinkBuf();
  1021.     }
  1022.     // 入出力先(0:ファイル,1:ポケット)
  1023.     if ( fileMode == 0 ){
  1024.         ret = WL_saveFile( termBuf, termSize );
  1025.     } else {
  1026.         ret = WL_savePocket( termBuf, termSize );
  1027.     }
  1028.     if ( ret != NOERR ){
  1029.         DM_showMsg( "保存失敗 (T-T)", NULL );
  1030.         return ERROR;
  1031.     }
  1032.     // バッファを開放
  1033.     WL_purgeBuf();
  1034.  
  1035.     return NOERR;
  1036. }
  1037.